import { Provide } from '@midwayjs/core'
import { Repository } from 'typeorm'
import { InjectEntityModel } from '@midwayjs/typeorm'
import { Users } from '../../entities/Users.entity'
import { encryptPassword, verifyPassword } from '../../utils/cryptoUtils'

@Provide()
export class AuthService {
  @InjectEntityModel(Users)
  repo!: Repository<Users>

  // 注册
  async register(data: {
    phone: string
    password: string
    role: number
    email?: string
    nickname?: string
  }) {
    if (![1, 2].includes(data.role)) {
      throw new Error('角色参数错误，role 必须为 1（志愿者）或 2（监护人）')
    }

    // 检查手机号是否已存在
    const existUser = await this.repo.findOne({
      where: { phone: data.phone }
    })
    if (existUser) {
      throw new Error('该手机号已注册')
    }

    // 如果提供了邮箱，检查邮箱是否已存在
    if (data.email) {
      const existEmail = await this.repo.findOne({
        where: { email: data.email }
      })
      if (existEmail) {
        throw new Error('该邮箱已被使用')
      }
    }

    // 加密密码
    const encryptedPassword = await encryptPassword(data.password)

    // 创建用户
    const user = this.repo.create({
      phone: data.phone,
      password: encryptedPassword,
      role: data.role as any,
      email: data.email || null,
      nickname: data.nickname || null,
      isDisabled: false as any
    })

    const savedUser = await this.repo.save(user)

    // 保存成功
    if(savedUser){
        return {}
    } else {
        throw new Error("注册失败")
    }
  }

  // 登录
  async login(data: {
    phone: string
    password: string
    role: number
  }) {
    // 验证 role 是否合法
    if (![1, 2].includes(data.role)) {
      throw new Error('角色参数错误，role 必须为 1（志愿者）或 2（监护人）')
    }

    // 查找用户
    const user = await this.repo.findOne({
      where: { phone: data.phone }
    })

    if (!user) {
      throw new Error('用户不存在')
    }

    // 检查用户是否被禁用
    if (user.isDisabled) {
      throw new Error('该账号已被禁用')
    }

    // 验证角色是否匹配
    if (Number(user.role) !== data.role) {
      throw new Error('角色不匹配，请使用正确的角色登录')
    }

    // 验证密码
    const isPasswordValid = await verifyPassword(data.password, user.password)
    if (!isPasswordValid) {
      throw new Error('密码错误')
    }

    // 返回用户信息（不包含密码）
    const { id, avatar, phone, nickname, userSign,certificateId,role,email } = user
    return {
      id,
      avatar,
      phone,
      nickname,
      userSign,
      certificateId,
      role,
      email
    }
  }

  // 登出
  async logout() {
    return {
      code: 200,
      message: '登出成功',
      data: null
    }
  }
}
